package com.cyz.manager.auth;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.cyz.manager.auth.model.SpaceUserAuthConfig;
import com.cyz.manager.auth.model.SpaceUserRole;
import com.cyz.model.entity.Space;
import com.cyz.model.entity.SpaceUser;
import com.cyz.model.entity.User;
import com.cyz.model.enums.SpaceRoleEnum;
import com.cyz.model.enums.SpaceTypeEnum;
import com.cyz.service.SpaceUserService;
import com.cyz.service.UserService;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 团队空间成员权限控制类
 * 获取空间成员所有权限，并保存到配置类中以便后续权限校验时使用
 * 该方法使用了json配置文件来保存成员权限，需要读取json文件，转换后存储到配置类中
 * 其他方法：
 * 可将角色权限信息保存到数据库中，
 * 分为三个表：团队空间用户表（已有） 团队空间角色表  团队空间权限表；
 * 分别存储相关信息，也方便读取权限
 */
@Component
public class SpaceUserAuthManager {


    @Resource
    private SpaceUserService spaceUserService;

    @Resource
    private UserService userService;

    private static final SpaceUserAuthConfig SPACE_USER_AUTH_CONFIG;

    // 在静态代码块中获取权限配置，读取到配置类中，避免重复获取
    static {
        // 读取json文件
        String json = FileUtil.readUtf8String("biz/spaceUserAuthConfig.json");
        // 解析json文件，赋值给配置类
        SPACE_USER_AUTH_CONFIG = JSONUtil.toBean(json, SpaceUserAuthConfig.class);
    }

    /**
     * 根据用户角色获取权限列表
     * @param userRole  用户角色
     * @return  权限列表
     */
    public List<String> getPermissionsByRole(String userRole){
        // 校验参数
        if (StrUtil.isBlank(userRole)){
            // 如果为空就返回空列表
            return new ArrayList<>();
        }

        // 获取权限信息
        SpaceUserRole role = SPACE_USER_AUTH_CONFIG.getRoles().stream()
                .filter(spaceUserRole -> Objects.equals(spaceUserRole.getKey(), userRole))
                .findFirst()
                .orElse(null);

        if (role == null){
            return new ArrayList<>();
        }
        // 返回用户权限列表
        return role.getPermissions();
    }


    public List<String> getPermissionList(Space space, User loginUser) {
        if (loginUser == null) {
            return new ArrayList<>();
        }
        // 管理员权限
        List<String> ADMIN_PERMISSIONS = getPermissionsByRole(SpaceRoleEnum.ADMIN.getValue());
        // 公共图库
        if (space == null) {
            if (userService.isAdmin(loginUser)) {
                return ADMIN_PERMISSIONS;
            }
            return new ArrayList<>();
        }
        SpaceTypeEnum spaceTypeEnum = SpaceTypeEnum.getEnumByValue(space.getSpaceType());
        if (spaceTypeEnum == null) {
            return new ArrayList<>();
        }
        // 根据空间获取对应的权限
        switch (spaceTypeEnum) {
            case PRIVATE:
                // 私有空间，仅本人或管理员有所有权限
                if (space.getUserId().equals(loginUser.getId()) || userService.isAdmin(loginUser)) {
                    return ADMIN_PERMISSIONS;
                } else {
                    return new ArrayList<>();
                }
            case TEAM:
                // 团队空间，查询 SpaceUser 并获取角色和权限
                SpaceUser spaceUser = spaceUserService.lambdaQuery()
                        .eq(SpaceUser::getSpaceId, space.getId())
                        .eq(SpaceUser::getUserId, loginUser.getId())
                        .one();
                if (spaceUser == null) {
                    return new ArrayList<>();
                } else {
                    return getPermissionsByRole(spaceUser.getSpaceRole());
                }
        }
        return new ArrayList<>();
    }


}
